import os
from pathlib import Path


def convert_docx_to_pdf(input_docx_path, output_pdf_path=None, method='auto'):
    """
    将Word文档(.docx)转换为PDF格式
    :param input_docx_path: 输入的.docx文件路径
    :param output_pdf_path: 输出的.pdf文件路径(可选)
    :param method: 转换方法 ('auto', 'comtypes', 'docx2pdf', 'unoserver')
    :return: 转换后的PDF文件路径
    """
    # 确保输入文件存在
    docx_path = Path(input_docx_path)
    if not docx_path.exists():
        raise FileNotFoundError(f"输入文件不存在: {docx_path}")
    if docx_path.suffix.lower() != '.docx':
        raise ValueError(f"文件不是有效的DOCX格式: {docx_path}")

    # 设置输出路径
    if output_pdf_path is None:
        pdf_path = docx_path.with_suffix('.pdf')
    else:
        pdf_path = Path(output_pdf_path)

    # 确保输出目录存在
    pdf_path.parent.mkdir(parents=True, exist_ok=True)

    # 自动选择最佳转换方法
    if method == 'auto':
        method = _select_best_conversion_method()

    # 执行转换
    if method == 'comtypes':
        return _convert_with_comtypes(docx_path, pdf_path)
    elif method == 'docx2pdf':
        return _convert_with_docx2pdf(docx_path, pdf_path)
    elif method == 'unoserver':
        return _convert_with_unoserver(docx_path, pdf_path)
    else:
        raise ValueError(f"未知的转换方法: {method}")


def _select_best_conversion_method():
    """自动选择最佳转换方法"""
    try:
        # 尝试使用docx2pdf作为首选
        import docx2pdf
        return 'docx2pdf'
    except ImportError:
        pass

    try:
        # 如果docx2pdf不可用，尝试comtypes（仅Windows）
        import comtypes
        import sys
        if sys.platform == 'win32':
            return 'comtypes'
    except ImportError:
        pass

    try:
        # 最后尝试unoserver
        import unoserver
        return 'unoserver'
    except ImportError:
        pass

    # 如果没有可用的库，提示安装
    raise RuntimeError("没有可用的转换库，请安装: pip install docx2pdf 或 pip install comtypes 或 pip install unoserver")


def _convert_with_comtypes(docx_path, pdf_path):
    """使用comtypes库转换(仅Windows, 需要安装Microsoft Word)"""
    import comtypes.client
    import sys

    if sys.platform != 'win32':
        raise OSError("comtypes方法仅支持Windows系统")

    word = comtypes.client.CreateObject('Word.Application')
    word.Visible = False

    try:
        doc = word.Documents.Open(str(docx_path))
        doc.SaveAs(str(pdf_path), FileFormat=17)  # 17 = PDF format
        doc.Close()
        return str(pdf_path)
    except Exception as e:
        raise RuntimeError(f"转换失败: {str(e)}")
    finally:
        word.Quit()


def _convert_with_docx2pdf(docx_path, pdf_path):
    """使用docx2pdf库转换(跨平台, 需要Microsoft Word或LibreOffice)"""
    from docx2pdf import convert

    try:
        convert(str(docx_path), str(pdf_path))
        return str(pdf_path)
    except Exception as e:
        raise RuntimeError(f"转换失败: {str(e)}")


def _convert_with_unoserver(docx_path, pdf_path):
    """使用unoserver库转换(跨平台, 需要LibreOffice)"""
    from unoserver import converter

    try:
        # 启动转换器服务
        conv = converter.UnoConverter()
        conv.convert(str(docx_path), str(pdf_path))
        return str(pdf_path)
    except Exception as e:
        raise RuntimeError(f"转换失败: {str(e)}")
    finally:
        # 确保关闭转换器
        if 'conv' in locals():
            conv.__exit__(None, None, None)


if __name__ == "__main__":
    # ====== 在这里设置你的输入路径 ======
    # 替换为你的DOCX文件路径
    input_docx_file = "D:\\hbyt\\AI智能投标\\能力组件-附件\\研发特有_沟通管理及问题事件响应机制_v1.0_2201.docx"

    # ====== 可选：设置输出路径 ======
    # 如果不设置，将保存在同一目录下，文件名相同但扩展名为.pdf
    output_pdf_file = None  # 例如: r"C:\Output\example.pdf"

    # ====== 可选：设置转换方法 ======
    # 可选值: 'auto', 'comtypes', 'docx2pdf', 'unoserver'
    # 默认'auto'会自动选择最佳可用方法
    conversion_method = 'auto'

    try:
        print(f"开始转换: {input_docx_file}")
        result_path = convert_docx_to_pdf(
            input_docx_path=input_docx_file,
            output_pdf_path=output_pdf_file,
            method=conversion_method
        )
        print(f"转换成功! PDF文件已保存到: {result_path}")
    except Exception as e:
        print(f"转换失败: {str(e)}")
        print("可能的解决方案:")
        print("1. 确保输入文件是有效的DOCX格式")
        print("2. 安装所需的依赖库:")
        print("   - Windows系统: pip install comtypes")
        print("   - 所有系统: pip install docx2pdf")
        print("   - 所有系统(需要LibreOffice): pip install unoserver")
        print("3. 确保系统已安装Microsoft Word或LibreOffice")